/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ec.edu.ups.cidi.siia.plamdep.analizadorLexico.analisis;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import ec.edu.ups.cidi.siia.plamdep.utils.configuracion.ConfiguracionAnalisiLexico;
import ec.edu.ups.cidi.siia.plamdep.utils.interfaces.IAnalisisUtils;

public class AnalisisUtils implements IAnalisisUtils
{
    public AnalisisUtils()
    {
        
        new Recursos();
    }
    
    public  String eliminaCaracteresDobles(String texto,String caracter){
    
    texto = texto.replaceAll(caracter + caracter, caracter);
    
     if(texto.contains("  ")){
      texto=eliminaCaracteresDobles(texto, caracter);
       
   } 
    return texto;
    }
   
    public List<Palabra> getStringAsArrayPalabras(String texto)
    {
    	 List<Palabra> palabras = new ArrayList<Palabra>();
        palabras=Recursos.freeling.analisis(texto);
        return palabras;

    }
    
    public   ArrayList<Palabra>  eliminarStopWords(ArrayList<Palabra> palabras)
    {
            for(int i=0;i<palabras.size();i++)
                for(String etiq:ConfiguracionAnalisiLexico.etqStopWord)
                {  
                    Palabra pal=palabras.get(i);
                    if(pal.getTipo().compareToIgnoreCase(etiq)==0)
                      palabras.remove(pal);
                       
                    
                }   
            return palabras;
    }
   
   static Map<String,List<Parrafo>> analizadosCache=new HashMap<String, List<Parrafo>>();
     public  List<Parrafo> getParrafos( String texto ){
    	 if(analizadosCache.containsKey(texto))
    		 return analizadosCache.get(texto);
    	 
    	 
        ArrayList<Parrafo> to = new ArrayList();
    

        if(ConfiguracionAnalisiLexico.tipoAnalisis.equalsIgnoreCase("API"))
        {
        	 texto= eliminaCaracteresDobles(texto, "\n");        	
             String[] tokenizar= texto.split("\n");
             
             for(String token: tokenizar)         
             {   Parrafo prf = new Parrafo(token);
             		prf.setPalabras(Recursos.freeling.analisis(token));
                  to.add(prf);
             }     
        }
        else if(ConfiguracionAnalisiLexico.tipoAnalisis.equalsIgnoreCase("consola"))
        {
       	    to=(Recursos.freeling.analisisConsola(texto,true));
        }
        
        analizadosCache.put(texto, to);
       return to;
    }
    /**
     * Metodo que busca las palabras mas repetidas
     * @param palabras Arreglo de palabras a analizar
     * @return ArrayList de las palabras mas repetidas.
     */
    
    public  List<Palabra> getRelevantes(ArrayList<Palabra> palabras)
    {
        HashMap<String, Integer> hs=new HashMap();
        for(Palabra p:palabras)
        {
            String pal=p.getPalabra().toLowerCase();
            if(hs.containsKey(pal))
            {
              int cont=hs.get(pal)+1;
              hs.put(pal, cont);
            }    
            else hs.put(pal, 1);
        }    
        int max=0;
        Iterator it = hs.entrySet().iterator();
        while (it.hasNext()) 
        { 
            Map.Entry<String, Integer> e = (Map.Entry)it.next(); 
            if(e.getValue()>max)max=e.getValue();
        }
        ArrayList<Palabra> relevantes= new ArrayList();
        it = hs.entrySet().iterator();
        while (it.hasNext()) 
        { 
            Map.Entry<String, Integer> e = (Map.Entry)it.next(); 
            if(e.getValue()==max)
                relevantes.add(new Palabra(e.getKey()));
        }
        return relevantes;
    }

    public ArrayList<NGrama> tokenizar(String texto, int numero) {
        ArrayList<NGrama> to = new ArrayList();
       
       texto= eliminaCaracteresDobles(texto, " ");    
       String[] tokenizar= texto.split(" ");
       ArrayList<String> tokens = new ArrayList<String>();
       for(String token: tokenizar)  tokens.add(token); 
       while((tokens.size()%numero)!=0)  tokens.add("");
      
       int i=0;
       while(i<tokens.size())
       {
           NGrama ng = new NGrama(numero);
           for(int y = 0; y<numero;y++){
              ng.addPalabra(tokens.get(i));
              i++;
           }
                     to.add(ng);
       }
       return to ;
    }



   

    
}
